/**
 * 
 */
package com.atozsoft.wf;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.eos.data.datacontext.DataContextManager;
import com.eos.data.datacontext.IUserObject;
import com.eos.engine.component.ILogicComponent;
import com.eos.foundation.data.DataObjectUtil;
import com.eos.foundation.database.DatabaseUtil;
import com.eos.system.annotation.Bizlet;
import com.primeton.ext.engine.component.LogicComponentFactory;

import commonj.sdo.DataObject;

/**
 * @author houfy
 * @date 2015-01-22 11:22:19
 *
 */
@Bizlet("ProcessAddexamine")
public class ProcessAddexamine {
	/**
	 * 执行加审人员和加审状态更新操作
	 * @param objs 查询出来的加审人员信息
	 * @param isSortStr 是否排序
	 * @param userId 当前登录人员Id
	 * @param addapproveid 加审表主键
	 * @param isbackflg 是否返回节点
	 * @return
	 * @throws Throwable
	 */
	@Bizlet("")
	public static boolean getIsEndAddExamineStatus(DataObject[] objs,String isSortStr,String userId,String addapproveid,String isbackflg) throws Throwable {
		List<DataObject> list = new ArrayList<DataObject>();
		boolean isSort = ("1".equals(isSortStr))? true:false; //是否排序
		boolean isEnd = false; //是加审结束标识
		int num=0; //当前加审人员所在的位置
		int len=objs.length;
		int executeNum = 0; //加审完成的数量
		for(int i=0;i<len;i++){  //循环找到当前加审人员
			DataObject obj = objs[i];
			if("1".equals(obj.get("executestatus").toString())) executeNum ++; //获取加审完成的数量
			
            if(obj.get("empid").toString().equals(userId)){  //当前人员为加审人员，更改加审执行状态
            	obj.set("executestatus", "1");  //执行状态为 ：已执行
            	list.add(obj);
            	num = i;
            }
		}
		if(isSort && ((num + 1) <= (len - 1))){ //加审是排序执行，且当前加审人员不是最后一个，则更改下一个加审人员的可执行状态
			DataObject obj = objs[num + 1];
			obj.set("sortstatus", "1"); //更改下一个加审人员可执行状态
			list.add(obj);
		}
		updateDataObject(list); //更改加审人员执行状态
		//是最后一个加审人，则更改主表中的加审执行状态
		if(executeNum == len - 1){
			 isEnd = true;
			 DataObject  info = DataObjectUtil.createDataObject("com.atozsoft.wf.process.ProcessConfigAddapprove"); 
			 info.set("executestatus", "1");
			 if("0".equals(isbackflg))
			  info.set("executestatus", "2");
			 info.set("addapproveid",addapproveid);
			 updateDataObject(info); //更改加审表执行状态
		}
		return isEnd;
	}
	
	/**
	 * 执行加审人员和加审状态更新操作
	 * @param objs 查询出来的加审人员信息
	 * @param isSortStr 是否排序
	 * @param userId 当前登录人员Id
	 * @param addapproveid 加审表主键
	 * @return
	 * @throws Throwable
	 */
	@Bizlet("")
	public static void updateAddExamineStatus(DataObject[] objs,String isSortStr,String userId,String addapproveid) throws Throwable {
		
	    List<DataObject> list = new ArrayList<DataObject>();
	    IUserObject userObject = DataContextManager.current().getMUODataContext().getUserObject();
		int len=objs.length;
		for(int i=0;i<len;i++){  //循环找到当前加审人员
			DataObject obj = objs[i];
			
            if(obj.get("empid").toString().equals(userId)){  //当前人员为加审人员，更改加审执行状态
            	obj.set("executestatus", "1");  //执行状态为 ：已执行
            	list.add(obj);
            	continue;
            }
            //更改加审人未处理的状态
            if("0".equals(obj.get("executestatus").toString())) {
            	obj.set("executestatus", "2");  //执行状态为 ：未处理
            	obj.set("updatedate", new Date());
            	obj.set("updater", userObject.getUserId());
            	list.add(obj);
            }
		}
		updateDataObject(list); //更新加审人的执行状态
		
		 DataObject  info = DataObjectUtil.createDataObject("com.atozsoft.wf.process.ProcessConfigAddapprove"); 
		 info.set("executestatus", "2");
		 info.set("addapproveid",addapproveid);
		 updateDataObject(info); //更改加审表执行状态
	}
	
	
	/**
	 * 调用更改逻辑流执行更改操作
	 * @param obj
	 * @throws Throwable
	 */
	public static void updateDataObject(DataObject obj) throws Throwable{
		ILogicComponent logicComponentS = LogicComponentFactory.create("com.atozsoft.commonutil.editEntityExtInitDate"); 
		 Object[] params=new Object[1];
		  params[0] = obj;
		Object[] objs = logicComponentS.invoke("updateEntityExtInitDateAndPersion",params);//在java代码中直接访问逻辑流
	}
	
	/**
	 * 更改未加审人操作状态
	 * @param obj
	 * @throws Throwable
	 */
	public static void updateDataObject(List<DataObject> list) throws Throwable{
		DatabaseUtil.updateEntityBatch("default", list.toArray(new DataObject[list.size()]));
	}
	
	
	/**
	 * 判断是否结束流程
	 * @param isend 是结束标识
	 * @param isbackflg 是否返回节点
	 * @return
	 */
	@Bizlet("")
	public static boolean isFinishWorkItem(boolean isend,String isbackflg) {
		boolean isFinish = false;
		if(isend && "0".equals(isbackflg)) isFinish = true;
		return isFinish;
	}
}
